package com.codedancer.campus.common.utils;

import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;


/**
 * @Author codeworld
 * @Date 2021/7/4 redis操作工具类
 **/
@Component
public class RedisUtil {


    private StringRedisTemplate redisTemplate;


    // 提供一个注入方法
    public void setRedisTemplate(StringRedisTemplate stringRedisTemplate) {
        redisTemplate = stringRedisTemplate;
    }

    /**
     * 删除缓存
     *
     * @param key
     */
    public void delete(String key) {
        this.redisTemplate.delete(key);
    }

    /**
     * 添加ip到缓存
     *
     * @param key
     * @param value
     * @return
     */
    public Long add(String key, String value) {
        return this.redisTemplate.opsForHyperLogLog().add(key, value);
    }

    /**
     * 获取总数
     *
     * @param key
     * @return
     */
    public Long size(String key) {
        return this.redisTemplate.opsForHyperLogLog().size(key);
    }

    /**
     * 获取全部的指定key
     *
     * @return
     */
    public Set<String> getKeys(String pattern) {
        return this.redisTemplate.keys(pattern);
    }

    /**
     * 是否存在key
     *
     * @param key
     * @return
     */
    public boolean isExist(String key) {
        return Boolean.TRUE.equals(this.redisTemplate.hasKey(key));
    }

    /**
     * 设置String 类型值
     *
     * @param key
     * @param value
     */
    public void setStringValue(String key, String value) {
        this.redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置String 类型值，并设置超时时间
     *
     * @param key
     * @param value
     */
    public void setStringValueAndTime(String key, String value, Long time) {
        this.redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    }

    /**
     * 获取string 类型 value
     *
     * @param key
     * @return
     */
    public String getStringValue(String key) {
        return (String) this.redisTemplate.opsForValue().get(key);
    }

    /**
     * 加1
     *
     * @param key
     */
    public void increment(String key) {
        redisTemplate.opsForValue().increment(key);
    }

    /**
     * 获取数量 通过增加或者减少
     *
     * @param key
     * @return
     */
    public Long getCountByIncOrdec(String key) {
        return redisTemplate.opsForValue().size(key);
    }

    /**
     * 减1
     *
     * @param key
     */
    public void decrement(String key) {
        redisTemplate.opsForValue().decrement(key);
    }
}
